home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / text / hyper / hsc_source.lha / source / hsc / output.c < prev    next >
C/C++ Source or Header  |  1996-09-09  |  5KB  |  191 lines

  1. /*
  2.  * hsc/output.c
  3.  *
  4.  * output functions for hsc
  5.  *
  6.  * Copyright (C) 1995,96  Thomas Aglassinger
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  *
  22.  * updated:  9-Sep-1996
  23.  * created:  1-Jul-1995
  24.  */
  25.  
  26. #include <errno.h>
  27.  
  28. #include "hsc/global.h"
  29. #include "hsc/status.h"
  30.  
  31. #include "ugly/returncd.h"
  32.  
  33. #define OUTPUT_STEPSIZE 8192
  34.  
  35. static DLLIST *outlist = NULL;
  36.  
  37. /*
  38.  * del_outstr
  39.  */
  40. static VOID del_outstr(APTR data)
  41. {
  42.     del_estr((EXPSTR *) data);
  43. }
  44.  
  45. /*
  46.  * init_output:
  47.  *
  48.  * init output string
  49.  *
  50.  * result: TRUE if sucessful, else FALSE
  51.  */
  52. BOOL init_output(HSCPRC * hp)
  53. {
  54.     BOOL ok = TRUE;             /* return value */
  55.     EXPSTR *outstring = init_estr(OUTPUT_STEPSIZE);     /* first output string */
  56.  
  57.     outlist = init_dllist((del_outstr));        /* init outstring-list */
  58.     app_dlnode(outlist, (APTR) outstring);      /* append first entry */
  59.  
  60.     return (ok);
  61. }
  62.  
  63. /*
  64.  * cleanup_output:
  65.  *
  66.  * free output string
  67.  *
  68.  */
  69. VOID cleanup_output(VOID)
  70. {
  71.     del_dllist(outlist);
  72. }
  73.  
  74. /*
  75.  * close_output
  76.  *
  77.  * close output file, if it not stdout
  78.  */
  79. BOOL write_output(HSCPRC * hp)
  80. {
  81. #define MAX_ERRORLEN 79
  82.     STRPTR outfilenm = NULL;
  83.     BOOL written = FALSE;
  84.  
  85.     if (outfilename)
  86.         outfilenm = estr2str(outfilename);
  87.  
  88.     if ((return_code == RC_OK)
  89.         || (return_code == RC_WARN)
  90.         || hp->debug) {
  91.         FILE *outfile = NULL;   /* output file */
  92.         char buf[MAX_ERRORLEN + 2];     /* buffer for error string */
  93.  
  94.         /*
  95.          * try to open output file
  96.          */
  97.         if (outfilenm) {
  98.             errno = 0;
  99.             outfile = fopen(outfilenm, "w");
  100.             if (!outfile) {
  101.                 strncpy(buf, "unable to open `", MAX_ERRORLEN);
  102.                 strncat(buf, estr2str(outfilename),
  103.                         MAX_ERRORLEN - strlen(buf));
  104.                 strncat(buf, "' for output: ", MAX_ERRORLEN - strlen(buf));
  105.                 strncat(buf, strerror(errno), MAX_ERRORLEN - strlen(buf));
  106.                 status_error(buf);
  107.             }
  108.         } else {
  109.             outfile = stdout;
  110.             outfilenm = STDOUT_NAME;
  111.         }
  112.  
  113.         /*
  114.          * write output
  115.          */
  116.         if (outfile) {
  117.  
  118.             DLNODE *nd = dll_first(outlist);
  119.  
  120.             status_msg("writting output..");
  121.             errno = 0;
  122.  
  123.             /* write whole list of output-strings */
  124.             while (nd && !errno) {
  125.  
  126.                 EXPSTR *outstring = (EXPSTR *) dln_data(nd);
  127.  
  128.                 nd = dln_next(nd);
  129. #if 1
  130.                 fwrite(estr2str(outstring), sizeof(char),
  131.                        estrlen(outstring), outfile);
  132. #endif
  133.             }
  134.  
  135.             /* handle write-error, display message */
  136.             if (errno) {
  137.  
  138.                 strncpy(buf, "error writing `", MAX_ERRORLEN);
  139.                 strncat(buf, estr2str(outfilename),
  140.                         MAX_ERRORLEN - strlen(buf));
  141.                 strncat(buf, "': ", MAX_ERRORLEN - strlen(buf));
  142.                 strncat(buf, strerror(errno), MAX_ERRORLEN - strlen(buf));
  143.                 status_error(buf);
  144.  
  145.             } else
  146.                 written = TRUE;
  147.  
  148.             status_clear();
  149.  
  150.             /* close output file */
  151.             if (outfile != stdout)
  152.                 fclose(outfile);
  153.  
  154.         }
  155.     } else {
  156.  
  157.         status_msg("no output written");
  158.         status_lf();
  159.  
  160.     }
  161.  
  162.     return (written);
  163. }
  164.  
  165. /*
  166.  * append_output
  167.  *
  168.  * append text to output string
  169.  */
  170. VOID append_output(STRPTR text)
  171. {
  172.     EXPSTR *outstr = (EXPSTR *) dln_data(dll_last(outlist));
  173.  
  174.     /* check if current output-string will be full */
  175.     if ((estrlen(outstr) + strlen(text) + 1) > OUTPUT_STEPSIZE) {
  176.  
  177.         /* if so, append a new output-string to the list
  178.          * and make use this one */
  179. #if DEBUG_HSC_OUTPUT
  180.         fprintf(stderr, DHSC "new string after %lu/%lu chars\n",
  181.                 estrlen(outstr), OUTPUT_STEPSIZE);
  182. #endif
  183.         outstr = init_estr(OUTPUT_STEPSIZE);
  184.         app_dlnode(outlist, (APTR) outstr);
  185.  
  186.     }
  187.  
  188.     app_estr(outstr, text);
  189. }
  190.  
  191.